import axios from 'axios'
import store from 'vuex'
import router from 'vue-router'
import { Message } from 'element-ui'
import { getTokenTime } from './storage'
const tokenTime = 3000
// 导出基准地址，原因：其他地方不是通过axios发请求的地方用上基准地址
export const baseURL = 'http://pcapi-xiaotuxian-front-devtest.itheima.net/'
const instance = axios.create({
  // axios 的一些配置，baseURL  timeout
  baseURL,
  timeout: 5000
})
// 请求拦截
instance.interceptors.request.use(config => {
  // 拦截业务逻辑
  // 进行请求配置的修改
  // 如果本地又token就在头部携带
  // 1. 获取用户信息对象
  const token = store.state.user.profile.token
  if (token) {
    // 主动介入 检测token是否超时
    if (checkTokenTime()) {
      store.commit('user/setUser', {})
      const fullPath = encodeURIComponent(router.currentRoute.value.fullPath)
      // encodeURIComponent 转换uri编码，防止解析地址出问题
      router.push('/login?redirectUrl=' + fullPath)
      return Promise.reject(new Error('token超时了'))
    }
    // 3. 设置token
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
}, err => {
  return Promise.reject(err)
})
// 响应拦截
instance.interceptors.response.use(res => res.data, err => {
  // 401 状态码，进入该函数  被动介入 token是否超时
  if (err.response && err.response.status === 401) {
    // 1. 清空无效用户信息
    // 2. 跳转到登录页
    // 3. 跳转需要传参（当前路由地址）给登录页码
    store.commit('user/setUser', {})
    // 当前路由地址
    // 组件里头：`/user?a=10` $route.path === /user  $route.fullPath === /user?a=10
    // js模块中：router.currentRoute.value.fullPath 就是当前路由地址，router.currentRoute 是ref响应式数据
    const fullPath = encodeURIComponent(router.currentRoute.value.fullPath)
    // encodeURIComponent 转换uri编码，防止解析地址出问题
    router.push('/login?redirectUrl=' + fullPath)
  } else {
    Message.error(err.message) // 提示错误信息
  }
  return Promise.reject(err)
})
// 检测token超时函数
function checkTokenTime () {
  const beforeTime = getTokenTime()
  const currentTime = Date.now()
  return (currentTime - beforeTime) / 100 - tokenTime
}
